UnityとCoreCLRのはなし


概要

Unibook振り返り+夏のLT大会!

http://eventdots.jp/event/593863


LTで申し込んだと思ってたら違ってた。しまった、、

隙があったのでやって良いとのことなんで代打。


プレゼンモードはこちら

https://dl.dropboxusercontent.com/u/36583594/outsource/UnityAndCoreCLR/index.html



DotNet Core

C#の最新バージョンがMacとかLinuxとかWindowsで動く



最新?

Unityで使ってるC#はDotNet3.5をMonoが実装したやつをUnityがさらに独自のセンスでチョイスしたやつ


DotNet 3.5 Unity ver

・mscorlib.dllっていうごった煮dllで動いてる。

Macだと、実体はUnity.appのフォルダの中のこのへんのどれか

・シングルスレッドで動かしたり、IEnumeratorでコルーチン使って動かす分にはまー問題ない

・反面、例えば通信とかでマルチスレッドにしたりとかメインスレッドに合流したりとかが面倒

頑張って実装した猛者とかもいる

Spicy Pixel Concurrency Kit https://www.assetstore.unity3d.com/en/#!/content/3586

UniRx https://www.assetstore.unity3d.com/jp/#!/content/17276

・メインスレッドで動作することを完全に放棄してマルチスレッドの化け物になった猛者とかもいる(それでも動く

AnotherThread https://github.com/unity3d-jp/AnotherThread

対して、DotNet Core は


DotNet Core

https://github.com/dotnet/coreclr

・言語的にはC#の最先端、DotNet 4.6

・mscorlibの代わりにcorefxっていう完全新作ライブラリ群を使う。

どのくらい完全新作かというと一部C#2.0とかで足されたものを抹消して全プラットフォームごとに別実装対応 + あわせてインターフェースかわるくらい新作

・Taskっつーのがあって便利

・いろんなプラットフォームでコンパイルできる



例えばどんな差があるの

Socket(TCPとかを扱う低レベルAPI)の切断用のAPIが 10個以上 -> 1個 になったりした。

かっこいい、、、、!!!


UnityもDotNet Foundation に入ったんで、そのうちCoreCLRとかベースで動くようになる? のか??

Unite Tokyo会場で聞いた時にはまずC#5.0、その後C#6.. みたいに対応するよって言ってた。

待ってればいいんだよな~~っていう。



今できることは?

DotNet Coreが出たことで、クライアントもサーバもC#で書ける

→やってみたい、、、やってみたくない、、、?



できたよ?


リアルタイム対戦ゲーム


1 vs 1 

1台 500円/月レベルの信じられない低スペックサーバで数百人まで同時接続可能

全部C#

クライアント:Unity

サーバ:DotNet Core 1.0



全部C#の利点って?

例えばゲームロジックをクライアントとサーバで共有できる

Unity独自のAPIを使わない前提

自分で簡単な判定ロジック作って使ったりとか


データ構造の定義を完全共有できる

クライアント -> サーバへとデータ送るじゃないですか。


その時のデータ形式、例えば

クライアント = Unity内で、クラス -> インスタンス -> JSON とか変形するじゃないですか。


受け取った側(サーバ)でも

サーバ = DotNet Core内で、JSON -> インスタンス -> クラスとか変形したいですよね。


ようはクラス定義の.csをクライアント <-> サーバで貫通させたいよねっていう。


これできると楽です。


速い

ぶっちゃけソケット周りの動作に関してはWindowsで動かすよりLinux/Mac上で動かしたほうがえらい高速な気がしている。

動作速度速い。かつ、恐ろしい環境でもかなり安定して動作する。


(もう3~4ヶ月動かしてるけど変なエラーに出会えない)



っていうか

1つのまともな言語でサーバとクライアント両方書けて(かたっぽはまだDotNet3.5っていう古代魚だが)

コンパイルがあってMacでもLinuxでもWindowsでもネイティブ吐き出しができて、かなり良い速度で動かせる言語+環境になってしまったのでは....?



調整中で公開できるもの

XrossPeerっていう、

クライアント:Unity

サーバ:DotNet Core 1.0


とかを可能にするツール。


checked it out!

1つのプロジェクト内でCoreCLRのビルドとUnityのビルドを共存させる

http://sassembla.github.io/Public/2016:07:05%2015-57-53/2016:07:05%2015-57-53.html


XrossPeer

https://github.com/sassembla/XrossPeer